package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/power-of-two'>2 的幂(Power of Two)</a>
 * <p>给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。</p>
 * <p>如果存在一个整数 x 使得 n == 2^x ，则认为 n 是 2 的幂次方。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：n = 1
 *      输出：true
 *      解释：20 = 1
 *
 *  示例 2：
 *      输入：n = 16
 *      输出：true
 *      解释：24 = 16
 *
 *  示例 3：
 *      输入：n = 3
 *      输出：false
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>-2^31 <= n <= 2^31 - 1</li>
 *     <li></li>
 *     <li></li>
 * </ul>
 * </p>
 * <b>进阶：你能够不使用循环/递归解决此问题吗？</b>
 *
 * @author c2b
 * @since 2025/4/28 11:46
 */
public class LC0231PowerOfTwo_S {
    static class Solution {
        public boolean isPowerOfTwo(int n) {
            // 最大的2的幂为：2^30。只需要判断n是否为2^30的约数即可
            return n > 0 && (1 << 30) % n == 0;
        }

        public boolean isPowerOfTwo2(int n) {
            while (n > 0 && n % 2 == 0) {
                n /= 2;
            }
            return n == 1;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isPowerOfTwo(1));
        System.out.println(solution.isPowerOfTwo(16));
        System.out.println(solution.isPowerOfTwo(3));
    }
}
